package myactest;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import third4lookup.ClientService;
import third4lookup.ReplaceMethodBean;
import third4lookup.UService;

/**
 * @author: ZhouBert
 * @date: 2020/9/19
 * @description:	体验 Method Injection【经典场景：单例 UService 每次调用 login 方法时，都需要一个原型 WalletService】
 * look-up method 究竟是什么？
 * look-up 是通过另一个 bean ,借由方法构造出另一个 bean 的方法注入；
 * replace-method 是将一个 bean 中的方法进行了替换完成的方法注入！
 * 默认情况下，他们都用到了 CglibSubclassingInstantiationStrategy 的 CGLIB 增强技术
 *
 * 本实例参考：
 * https://www.cnblogs.com/leodaxin/p/9383863.html
 * Spring 之 Method Injection
 * https://blog.csdn.net/easyjf/article/details/1344361
 * 在 Spring 中使用 replaced-method 来进行方法替换
 */
public class LookupMethodTest {


	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("lookup.xml");
		for (int i = 0; i < 5; i++) {
			UService userService = (UService) ctx.getBean("userService");
			//这里涉及到了 抽象类的实例化！
			// 通过 debugger 可以发现，其实是生成的实例是 CGLIB 增强后的！
			userService.login("daxin", "root");
		}
		//体验 factory-method
		ClientService clientService = (ClientService) ctx.getBean("clientService");
		System.out.println("clientService = " + clientService);

		ReplaceMethodBean testBean = (ReplaceMethodBean) ctx.getBean("testBean");
		testBean.test();
		ctx.close();
	}
}
